package com.example.project10;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;

import java.util.ArrayList;
import java.util.List;

/**
 * UserListFragment 用于显示从网络获取的用户列表
 * 遵循 MVVM 架构模式
 */
public class UserListFragment extends Fragment {

    // --- UI 控件成员变量 ---
    private RecyclerView rvUsers; // 用于显示用户列表的核心控件
    private SwipeRefreshLayout swipeRefreshLayout; // 支持下拉刷新功能的外层容器
    private TextView tvEmptyState; // 用于显示空状态提示的文本视图

    // --- 架构组件成员变量 ---
    private UserViewModel userViewModel; // 用户列表ViewModel
    private RecommendationAdapter adapter; // RecyclerView 的适配器
    private Handler timeoutHandler; // 用于处理5秒超时
    private Runnable timeoutRunnable; // 超时任务

    /**
     * Fragment 生命周期方法：创建视图（View）。
     */
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // 加载 fragment_user_list.xml 布局文件，生成视图对象
        View view = inflater.inflate(R.layout.fragment_user_list, container, false);

        // 初始化视图控件
        rvUsers = view.findViewById(R.id.rv_users);
        swipeRefreshLayout = view.findViewById(R.id.swipe_refresh_layout);
        tvEmptyState = view.findViewById(R.id.tv_empty_state);

        // 创建 Handler
        timeoutHandler = new Handler(Looper.getMainLooper());

        return view;
    }

    /**
     * Fragment 生命周期方法：视图（View）已经创建完成。
     */
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        // 获取 ViewModel 实例
        userViewModel = new ViewModelProvider(this).get(UserViewModel.class);

        // 设置 RecyclerView
        setupRecyclerView();

        // 设置下拉刷新功能
        setupSwipeRefresh();

        // 观察 ViewModel 中的 LiveData 数据变化
        observeData();

        // 通知 ViewModel 开始加载初始数据
        userViewModel.loadUsers();
    }

    /**
     * 辅助方法：初始化和配置 RecyclerView。
     */
    private void setupRecyclerView() {
        // 设置布局管理器
        rvUsers.setLayoutManager(new LinearLayoutManager(getContext()));
        
        // 创建适配器实例
        adapter = new RecommendationAdapter(getContext(), new ArrayList<>());

        // 将适配器设置给 RecyclerView
        rvUsers.setAdapter(adapter);
    }

    /**
     * 辅助方法：初始化和配置 SwipeRefreshLayout。
     */
    private void setupSwipeRefresh() {
        if (swipeRefreshLayout != null) {
            // 设置下拉刷新事件的监听器
            swipeRefreshLayout.setOnRefreshListener(() -> {
                if (userViewModel != null) {
                    userViewModel.refreshUsers();
                    // 启动5秒超时计时器
                    startTimeoutTimer();
                }
            });

            // 设置刷新动画的颜色方案
            swipeRefreshLayout.setColorSchemeColors(
                    0xFF2196F3, // 蓝色
                    0xFF4CAF50, // 绿色
                    0xFFFF9800, // 橙色
                    0xFFE91E63  // 红色
            );
        }
    }

    /**
     * 启动5秒超时计时器
     */
    private void startTimeoutTimer() {
        // 取消之前的计时器（如果有的话）
        if (timeoutRunnable != null) {
            timeoutHandler.removeCallbacks(timeoutRunnable);
        }

        // 创建新的超时任务
        timeoutRunnable = () -> {
            // 5秒后停止刷新动画并显示提示
            if (swipeRefreshLayout != null) {
                swipeRefreshLayout.setRefreshing(false);
            }
            
            // 显示错误提示
            if (tvEmptyState != null) {
                tvEmptyState.setVisibility(View.VISIBLE);
                tvEmptyState.setText("网络连接失败请稍后再试");
                tvEmptyState.setTextColor(0xFFFF0000); // 红色
            }
            
            // 清空列表
            if (adapter != null) {
                adapter.updateItems(new ArrayList<>());
            }
        };

        // 启动5秒计时器
        timeoutHandler.postDelayed(timeoutRunnable, 5000);
    }

    /**
     * 辅助方法：观察 ViewModel 中的 LiveData 对象。
     */
    private void observeData() {
        if (userViewModel == null) return;

        // 观察用户列表数据的变化
        userViewModel.getUserList().observe(getViewLifecycleOwner(), users -> {
            // 取消超时计时器
            if (timeoutRunnable != null) {
                timeoutHandler.removeCallbacks(timeoutRunnable);
            }

            if (users != null && adapter != null) {
                // 转换User对象为RecommendationItem对象以适配现有适配器
                List<RecommendationItem> items = new ArrayList<>();
                for (User user : users) {
                    RecommendationItem item = new RecommendationItem(
                            user.getId(),
                            user.getFullName(),
                            user.getEmail(),
                            "用户",
                            user.getAvatar(),
                            5.0 // 默认评分
                    );
                    items.add(item);
                }
                
                // 更新列表显示
                adapter.updateItems(items);
                
                // 停止刷新动画
                if (swipeRefreshLayout != null) {
                    swipeRefreshLayout.setRefreshing(false);
                }
                
                // 根据数据状态显示/隐藏空状态提示
                if (items.isEmpty()) {
                    if (tvEmptyState != null) {
                        tvEmptyState.setVisibility(View.VISIBLE);
                        tvEmptyState.setText("暂无用户数据");
                        tvEmptyState.setTextColor(0xFF666666); // 灰色
                    }
                } else {
                    if (tvEmptyState != null) {
                        tvEmptyState.setVisibility(View.GONE);
                    }
                }
            }
        });

        // 观察加载状态的变化
        userViewModel.getIsLoading().observe(getViewLifecycleOwner(), isLoading -> {
            // 这里我们不再根据加载状态控制刷新动画，而是使用5秒超时机制
        });
        
        // 观察错误状态的变化
        userViewModel.getError().observe(getViewLifecycleOwner(), error -> {
            // 取消超时计时器
            if (timeoutRunnable != null) {
                timeoutHandler.removeCallbacks(timeoutRunnable);
            }

            if (error != null) {
                // 停止刷新动画
                if (swipeRefreshLayout != null) {
                    swipeRefreshLayout.setRefreshing(false);
                }

                switch (error) {
                    case "NETWORK_ERROR":
                        // 网络连接失败场景
                        if (tvEmptyState != null) {
                            tvEmptyState.setVisibility(View.VISIBLE);
                            tvEmptyState.setText("网络连接失败请稍后再试");
                            tvEmptyState.setTextColor(0xFFFF0000); // 红色
                        }
                        if (adapter != null) {
                            adapter.updateItems(new ArrayList<>()); // 清空列表
                        }
                        break;
                    case "SERVER_ERROR":
                        // 服务器返回错误状态码
                        if (tvEmptyState != null) {
                            tvEmptyState.setVisibility(View.VISIBLE);
                            tvEmptyState.setText("网络连接失败请稍后再试");
                            tvEmptyState.setTextColor(0xFFFF0000); // 红色
                        }
                        if (adapter != null) {
                            adapter.updateItems(new ArrayList<>()); // 清空列表
                        }
                        break;
                    case "EMPTY_DATA":
                        // 服务器返回空数据
                        if (tvEmptyState != null) {
                            tvEmptyState.setVisibility(View.VISIBLE);
                            tvEmptyState.setText("暂无用户数据");
                            tvEmptyState.setTextColor(0xFF666666); // 灰色
                        }
                        if (adapter != null) {
                            adapter.updateItems(new ArrayList<>()); // 清空列表
                        }
                        break;
                    default:
                        // 数据解析失败场景
                        if (tvEmptyState != null) {
                            tvEmptyState.setVisibility(View.VISIBLE);
                            tvEmptyState.setText("网络连接失败请稍后再试");
                            tvEmptyState.setTextColor(0xFFFF0000); // 红色
                        }
                        if (adapter != null) {
                            adapter.updateItems(new ArrayList<>()); // 清空列表
                        }
                        break;
                }
            } else {
                // 只有在列表为空时才隐藏错误提示
                if (adapter != null && adapter.getItemCount() == 0) {
                    if (tvEmptyState != null) {
                        tvEmptyState.setVisibility(View.GONE);
                    }
                }
            }
        });
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        // 清理计时器
        if (timeoutRunnable != null) {
            timeoutHandler.removeCallbacks(timeoutRunnable);
        }
    }
}